
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>3、Enum - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>3、Enum - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Java中的枚举（Enum）在本质上是什么？它隐式地继承了哪个类？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">枚举在Java中实际上是一个特殊的类，它继承自`java.lang.Enum`抽象类。每个枚举常量都是该类的一个实例，并且这些实例是单例的。</div>
          </div>
          <div class="card-source">来源: 1.1 枚举的本质</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">除了定义常量，Java枚举还可以具备哪些高级特性来增强其功能？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">枚举可以添加成员变量、构造函数（必须是私有的或包级私有的）和方法，来封装与常量相关的行为。此外，枚举还可以实现一个或多个接口，从而更好地融入Java的类型系统。</div>
          </div>
          <div class="card-source">来源: 1.2 枚举的高级特性</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">为什么说使用枚举是实现单例模式的最佳方式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为枚举实现的单例模式不仅简洁、线程安全，而且由JVM保证只会被实例化一次。它还天然具备序列化机制，并能有效防止通过反射攻击来创建新的实例。</div>
          </div>
          <div class="card-source">来源: 2.2 单例模式实现</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">如何利用Java枚举实现策略模式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">通过让每个枚举常量代表一种不同的策略或算法。可以在枚举中定义一个抽象方法，然后每个枚举常量都重写这个方法，提供该策略的具体实现。这样，不同的算法就被封装在了各个枚举常量中。</div>
          </div>
          <div class="card-source">来源: 2.3 策略模式实现</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在实现状态机时，使用枚举有什么优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">使用枚举实现状态机，可以将每个状态定义为一个枚举常量，并在常量内部封装状态转换的逻辑（例如，定义`nextStatus()`和`canTransitionTo()`等方法）。这种方式使得状态逻辑更加清晰、内聚，并且保证了类型安全。</div>
          </div>
          <div class="card-source">来源: 2.1 状态机实现</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">当需要根据枚举的某个属性频繁查找对应的枚举常量时，如何将查找效率从O(n)优化到O(1)？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以通过在枚举内部使用一个静态的Map来优化查找性能。在静态初始化块中，遍历所有枚举常量并将其属性值和常量本身存入Map。这样，后续的查找就可以通过Map的get方法实现，时间复杂度为O(1)。</div>
          </div>
          <div class="card-source">来源: 3.1 枚举映射与查找优化</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">如何结合枚举和位运算来高效地管理一组可组合的权限标志？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以将每个权限枚举常量的值设置为2的幂（如1, 2, 4）。这样，多个权限可以通过位或（|）运算组合成一个整数值。检查是否拥有某个权限时，使用位与（&）运算。这种方法既能保证类型安全，又非常高效。</div>
          </div>
          <div class="card-source">来源: 3.2 组合枚举与位运算</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Java枚举的序列化机制有何特别之处？它如何保证反序列化后对象的唯一性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">枚举在序列化时，只将枚举常量的名称写入流中，而不是整个对象的状态。在反序列化时，JVM会根据这个名称查找当前JVM中已存在的对应枚举实例并返回。这个机制确保了即使在反序列化之后，得到的仍然是同一个单例对象。</div>
          </div>
          <div class="card-source">来源: 4.2 枚举的序列化机制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">从编译原理上看，Java编译器是如何处理一个枚举定义的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">编译器会将枚举定义转换成一个继承自`java.lang.Enum`的`final`类。每个枚举常量会变成该类的一个`public static final`实例。编译器还会自动生成一些静态方法，例如返回所有常量数组的`values()`方法和根据名称查找常量的`valueOf(String name)`方法。</div>
          </div>
          <div class="card-source">来源: 4.1 枚举的编译原理</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
